<?php
namespace app\middleware;

class Cors
{
    // 处理请求的核心方法
    public function handle($request, \Closure $next)
    {
        // 1. 配置允许的跨域源（生产环境务必指定具体域名，不要用 *）
        $allowOrigin = 'https://dev002.gxyushengwenhua.com';

        // （可选）支持多个跨域源（如测试环境+生产环境）
        // $allowOrigins = [
        //     'https://dev002.gxyushengwenhua.com',
        //     'https://test-dev002.gxyushengwenhua.com' // 测试域名
        // ];
        // // 动态匹配请求源，若在允许列表中则赋值
        // if (in_array($request->header('origin'), $allowOrigins)) {
        //     $allowOrigin = $request->header('origin');
        // }

        // 2. 设置 CORS 核心响应头（必须在响应发送前设置）
        $response = $next($request); // 先执行后续业务逻辑，获取响应对象
        $response->header([
            // 允许的跨域源（关键，解决 No 'Access-Control-Allow-Origin' 错误）
            'Access-Control-Allow-Origin'      => $allowOrigin,
            // 允许的请求方法（覆盖接口可能用到的方法，如 POST/PUT/DELETE）
            'Access-Control-Allow-Methods'     => 'GET, POST, PUT, DELETE, OPTIONS',
            // 允许的请求头（需包含前端实际发送的头，如 Content-Type/Authorization）
            'Access-Control-Allow-Headers'     => 'Content-Type, Authorization, X-Requested-With',
            // （可选）允许跨域携带 Cookie（需前端同步设置 withCredentials: true）
            'Access-Control-Allow-Credentials' => 'true',
            // （可选）预检请求缓存时间（单位：秒，减少 OPTIONS 请求次数）
            'Access-Control-Max-Age'           => '86400' // 1天内无需重复发送预检
        ]);

        // 3. 处理 OPTIONS 预检请求（关键！否则复杂请求会失败）
        // 浏览器发送 POST/PUT 等请求前，会先发送 OPTIONS 请求验证跨域权限
        if ($request->method() === 'OPTIONS') {
            // 预检请求无需返回业务数据，直接返回 204 状态码（No Content）
            return $response->code(204);
        }

        // 4. 返回处理后的响应（包含 CORS 头）
        return $response;
    }
}